/* main.c */
#include "app_inc.h"

/*******************************************************************************
 * Definitions
 ******************************************************************************/

/*******************************************************************************
 * Variables
 ******************************************************************************/

/*******************************************************************************
 * Prototypes
 ******************************************************************************/
static void app_lwip_init(void);
static void app_lwip_process_mac(void);


extern void  app_lwip_udp_server_init(void);

/*******************************************************************************
 * Code
 ******************************************************************************/

int main(void)
{
    board_init();
    printf("\r\n lwip_udp_basic, build on %s, %s\r\n", __DATE__, __TIME__);

    /* 准备lwip内核, 并激活enc28j60网卡. */
    app_lwip_init();

    /* 初始化服务器线程. */
    app_lwip_udp_server_init();

    /* 轮询方式查看网卡收到的帧, 并及时处理. */
    while (1)
    {
        /* 处理网卡收到的帧. */
        app_lwip_process_mac();

        /* 处理超时事件. */
        sys_check_timeouts();

        /* 用户代码. */
    }
}

extern uint8_t enc28j60_mac_addr[6]; /* 在ethernetif.c文件中已经定义过. */
extern err_t ethernetif_init(struct netif *netif); /* 在ethernetif.c文件中已经定义. */
extern int ethernetif_input(struct netif *netif);
struct netif enc28j60_netif; /* 定义一个全局使用的网卡对象. */

static void app_lwip_init(void)
{
    /* lwip. */
    struct ip_addr ipaddr;
    struct ip_addr netmask;
    struct ip_addr gateway;

    /* 初始化lwip的内核. */
    lwip_init();
    IP4_ADDR(&gateway, 192, 168,   1,   1);
    IP4_ADDR(&netmask, 255, 255, 255,   0);
    IP4_ADDR(&ipaddr , 192, 168,   1, 131); /* 本机ip地址. */

    /* 向lwip注册网卡. */
    netif_add(&enc28j60_netif, &ipaddr, &netmask, &gateway,
              NULL, ethernetif_init, ethernet_input);
    netif_set_default(&enc28j60_netif); /* 设置enc28j60_netif为默认网卡. */
    netif_set_up(&enc28j60_netif); /* 启动enc28j60_netif网卡. */

    printf(" network ready.\r\n");
    printf(" - gateway: 192, 168,   1,   1\r\n");
    printf(" - netmask: 255, 255, 255,   0\r\n");
    printf(" - ip addr: 192, 168,   1, 131\r\n");
    printf("\r\n");
}

/* 读完当前网卡接收到的mac帧数据, 并将输入送入lwip内核进行处理. */
static void app_lwip_process_mac(void)
{
    int ret = 0u;
    do
    {
        ret = ethernetif_input(&enc28j60_netif);
    } while (ret);
}

/* EOF. */

